home *** CD-ROM | disk | FTP | other *** search
/ Sounds Terrific 2 / Sounds Terrific II (1996)(Weird Science)(Disc 1 of 2)[Amiga-PC].iso / archives / amiga / amisox33.lha / AmiSOX3.3 / dist / dat.c < prev    next >
C/C++ Source or Header  |  1994-01-23  |  2KB  |  113 lines

  1.  
  2. /*
  3.  * July 5, 1991
  4.  * Copyright 1991 Lance Norskog And Sundry Contributors
  5.  * This source code is freely redistributable and may be used for
  6.  * any purpose.  This copyright notice must be maintained. 
  7.  * Lance Norskog And Sundry Contributors are not responsible for 
  8.  * the consequences of using this software.
  9.  */
  10.  
  11. /*
  12.  * Sound Tools text format file.  Tom Littlejohn, March 93.
  13.  *
  14.  * Reads/writes sound files as text for use with fft and graph.
  15.  *
  16.  * June 28, 93: force output to mono.
  17.  */
  18.  
  19. #include "st.h"
  20. #include "libst.h"
  21.  
  22. IMPORT int summary, verbose;
  23.  
  24. static double time, deltat;
  25.  
  26. long roundoff(x)
  27. double x;
  28. {
  29.     if (x < 0.0) return(x - 0.5);
  30.     else return(x + 0.5);
  31.     }
  32.  
  33. void
  34. datstartread(ft)
  35. ft_t ft;
  36. {
  37.    char inpstr[82];
  38.    char sc;
  39.  
  40.    while (ft->info.rate == 0) {
  41.       fgets(inpstr,82,ft->fp);
  42.       sscanf(inpstr," %c",&sc);
  43.       if (sc != ';') fail("Cannot determine sample rate.");
  44.       sscanf(inpstr," ; Sample Rate %ld",&ft->info.rate);
  45.       }
  46.  
  47.    /* size and style are really not necessary except to satisfy caller. */
  48.  
  49.    ft->info.size = DOUBLE;
  50.    ft->info.style = SIGN2;
  51. }
  52.  
  53. void
  54. datstartwrite(ft)
  55. ft_t ft;
  56. {
  57.    double srate;
  58.  
  59.    /*
  60.    if (ft->info.channels > 1)
  61.         fail("Cannot create .dat file with more than one channel.");
  62.    */
  63.    ft->info.channels = 1;
  64.    time = 0.0;
  65.    srate = ft->info.rate;
  66.    deltat = 1.0 / srate;
  67.    fprintf(ft->fp,"; Sample Rate %ld\015\n",ft->info.rate);
  68. }
  69.  
  70. datread(ft, buf, nsamp)
  71. ft_t ft;
  72. long *buf, nsamp;
  73. {
  74.     char inpstr[82];
  75.     double sampval;
  76.     int retc;
  77.     int done = 0;
  78.     char sc;
  79.  
  80.     while (done < nsamp) {
  81.         do {
  82.           fgets(inpstr,82,ft->fp);
  83.           if feof(ft->fp) return done;
  84.           sscanf(inpstr," %c",&sc);
  85.           }
  86.           while(sc == ';');  /* eliminate comments */
  87.         retc = sscanf(inpstr,"%*s %lg",&sampval);
  88.         if (retc != 1) fail("Unable to read sample.");
  89.         *buf++ = roundoff(sampval * 2.147483648e9);
  90.         ++done;
  91.     }
  92.     return done;
  93. }
  94.  
  95. void
  96. datwrite(ft, buf, nsamp)
  97. ft_t ft;
  98. long *buf, nsamp;
  99. {
  100.  int done = 0;
  101.     double sampval;
  102.  
  103.     while(done < nsamp) {
  104.        sampval = *buf++ ;
  105.        sampval = sampval / 2.147483648e9;  /* normalize to approx 1.0 */
  106.        fprintf(ft->fp," %15.8g  %15.8g \015\n",time,sampval);
  107.        time += deltat;
  108.        done++;
  109.        }
  110.     return;
  111. }
  112.  
  113.